package study.base.arraylist;

/**
 * 稀疏数组
 *
 * @author : zhuxiaodong
 * @date : 2020/12/6
 */
public class Demo03 {
    /**
     * 统计原始数组有多少个有效数值
     *
     * @param array 需要转换的数组
     * @return 转换后的数组
     */
    public static int countValue(int[][] array) {
        //统计有效数
        int sum = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] != 0) {
                    sum++;
                }
            }
        }
        return sum;
    }

    /**
     * 转为稀疏数组
     * 稀疏数组：第一行的值分别为原始数组的行数，列数，值
     *
     * @param array
     * @return
     */
    public static int[][] sparseArray(int[][] array) {
        //行：有效数值+第一行的统计值,列:固定3
        int[][] arrays = new int[countValue(array) + 1][3];
        arrays[0][0] = array.length;
        arrays[0][1] = array[0].length;
        arrays[0][2] = countValue(array);
        //计行数,从第一行开始计
        int count = 1;
        for (int i = 1; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] != 0) {
                    arrays[count][0] = i;
                    arrays[count][1] = j;
                    arrays[count][2] = array[i][j];
                    //找到有效数后新增一行另计
                    count++;
                }
            }
        }
        return arrays;
    }

    /**
     * 读取稀疏数组
     *
     * @param sparseArray   稀疏数组
     * @return
     */
    public static int[][] readArray(int[][] sparseArray) {
        //读取稀疏数组第一行获取行和列
        int[][] array = new int[sparseArray[0][0]][sparseArray[0][1]];
        //读取第二行的值开始还原
        for (int i = 1; i < sparseArray.length; i++) {
            array[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        return array;
    }

    public static void main(String[] args) {
        //定义一个11*11的棋盘,并赋值,其中0:空,1:黑棋,2:白棋
        int[][] array = new int[11][11];
        array[1][2] = 1;
        array[2][3] = 2;
        //输出棋盘
        System.out.println("==================原始数组==================");
        for (int[] nums : array) {
            for (int num : nums) {
                System.out.print(num + "\t");
            }
            System.out.println();
        }
        System.out.println("==================有效数值==================");
        System.out.println("数组中有效数值为：" + countValue(array));
        System.out.println("==================稀疏数组==================");
        int[][] arrays = sparseArray(array);
        for (int[] nums : arrays) {
            for (int num : nums) {
                System.out.print(num + "\t");
            }
            System.out.println();
        }
        System.out.println(("==================稀疏转原=================="));
        int[][] array1 = readArray(arrays);
        for (int[] nums : array1) {
            for (int num : nums) {
                System.out.print(num + "\t");
            }
            System.out.println();
        }
    }
}
